package com.ly.cloud.service.impl;

import com.baomidou.mybatisplus.plugins.Page;
import com.ly.cloud.dto.ClassInfoDropDownDto;
import com.ly.cloud.dto.ClassInfoDto;
import com.ly.cloud.entity.ClassInfoPo;
import com.ly.cloud.entity.GradeProfessionalInfoPo;
import com.ly.cloud.exception.CloudException;
import com.ly.cloud.exception.mapper.DBException;
import com.ly.cloud.mapper.ClassInfoMapper;
import com.ly.cloud.mapper.GradeProfessionalInfoMapper;
import com.ly.cloud.service.ClassInfoService;
import com.ly.cloud.utils.BeanCopyUtils;
import com.ly.cloud.vo.ClassInfoDropDownVo;
import com.ly.cloud.vo.ClassInfoVo;
import com.ly.cloud.vo.DepartmentVo;
import com.ly.cloud.vo.NjZyTemplateVo;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description:
 * @Author: pengshiqng
 * @Date: Create in 2018/12/14
 */
@Service
public class ClassInfoServiceImpl implements ClassInfoService {

    @Autowired
    private ClassInfoMapper classInfoPoMapper;

    @Autowired
    GradeProfessionalInfoMapper gradeProfessionalInfoPoMapper;	//年级专业mapper


    /**
     * 分页 + 条件查询
     * @param page
     * @param dto
     * @return
     */
    @Override
    public Page<ClassInfoVo> selectPage(Page<ClassInfoVo> page, ClassInfoDto dto) {
        try {
            return page.setRecords(classInfoPoMapper.selectPage(page, dto));
        }catch (Exception e){
            e.printStackTrace();
            throw new CloudException("查询异常，请重试!", e);
        }
    }
    
    /** 
   	 * Method Name: selectById
   	 * Description:  
   	 * 根据班级编号查询班级信息
   	 * @param bjdm 班级代码
   	 * @return 班级信息
   	 * @author luhuacong
   	 * @date: 2018年12月19日
   	 */
    @Override
	public ClassInfoVo selectById(String bjdm) {
    	ClassInfoVo vo = new ClassInfoVo();
		try {
			ClassInfoPo po = classInfoPoMapper.selectById(bjdm);
			vo = BeanCopyUtils.copyBeanProperties(po, ClassInfoVo.class);
			return vo;
		} catch (Exception e) {
			 throw new DBException("获取班级信息异常，请重试!", e);
		}
	}

    /**
     * 根据主键删除
     * @param id
     * @return
     */
    @Override
    public int deleteById(String id) {
        try {
            return classInfoPoMapper.deleteById(id);
        } catch (Exception e){
            e.printStackTrace();
            throw new CloudException("删除异常，请重试!", e);
        }
    }

    /**
     * 根据主键批量删除
     * @param ids
     * @return
     */
    @Override
    public int deleteByIds(List<String> ids) {
        try {
            return classInfoPoMapper.deleteBatchIds(ids);
        } catch (Exception e){
            e.printStackTrace();
            throw new CloudException("批量删除异常，请重试!", e);
        }
    }

    /**
     * 新增
     * @param loginUserName
     * @param dto
     * @return
     */
    @Override
    public int insert(String loginUserName ,ClassInfoDto dto) {
        try {
            //把dto对象转po对象
            ClassInfoPo po = BeanCopyUtils.copyBeanProperties(dto, ClassInfoPo.class);
            po.setCjr(loginUserName);
            po.setCjsj(new Date());
            return classInfoPoMapper.insert(po);
        } catch (Exception e){
            e.printStackTrace();
            throw new CloudException("新增失败!", e);
        }
    }

    /**
     * 修改
     * @param loginUserName
     * @param dto
     * @return
     */
    @Override
    public int uodateById(String loginUserName , ClassInfoDto dto) {
        try {
            //把dto对象转po对象
            ClassInfoPo po = BeanCopyUtils.copyBeanProperties(dto, ClassInfoPo.class);
            po.setXgr(loginUserName);
            po.setXgsj(new Date());
            return classInfoPoMapper.updateById(po);
        } catch (Exception e){
            e.printStackTrace();
            throw new CloudException("更新失败!", e);
        }
    }

    /**
     * 查询所有的年级
     * @return
     */
    @Override
    public List<String> findAllGrade() {
        try {
            return classInfoPoMapper.findAllGrade();
        } catch (Exception e){
            e.printStackTrace();
            throw new CloudException("查询失败!", e);
        }
    }

    /**
     * 根据年级查询所有的学院
     * @param grade
     * @return
     */
    @Override
    public List<DepartmentVo> findAllCollegeByGrade(String grade) {
        try {
            return classInfoPoMapper.findAllCollegeByGrade(grade);
        } catch (Exception e){
            e.printStackTrace();
            throw new CloudException("查询失败!", e);
        }
    }

    /**
     * 根据年级+学院查询所有的专业
     * @param grade
     * @param college
     * @return
     */
    @Override
    public List<NjZyTemplateVo> findAllProfessional(String grade, String college) {
        try {
            return classInfoPoMapper.findAllProfessional(grade,college);
        } catch (Exception e){
            e.printStackTrace();
            throw new CloudException("查询失败!", e);
        }
    }
    
    /** 
   	 * Method Name: selectDropDownBjxx
   	 * Description:  
   	 * 根据条件查询班级下拉列表
   	 * @param dto 条件封装
   	 * @return 班级下拉列表
   	 * @author luhuacong
   	 * @date: 2018年12月20日
   	 */
    @Override
	public List<ClassInfoDropDownVo> selectDropDownBjxx(ClassInfoDropDownDto dto) {
    	try {
			List<ClassInfoDropDownVo> voList = classInfoPoMapper.selectDropDownBjxx(dto);
			return voList;
		} catch (Exception e) {
			throw new CloudException("查询班级下拉信息失败!", e);
		}
		
	}
    
    /** 
   	 * Method Name: selectXzByBjdm
   	 * Description:  
   	 * 根据班级编号查询学制
   	 * @param bjdm 班级代码
   	 * @return 班级的学制
   	 * @author luhuacong
   	 * @date: 2018年12月20日
   	 */
	@Override
	public Map<String,String> selectXzByBjdm(String bjdm) {
		Map<String,String> map = new HashMap<>();
		try {
			ClassInfoPo po = classInfoPoMapper.selectById(bjdm);
			map.put("xz", po.getXz());
		} catch (Exception e) {
			throw new DBException("查询学制失败!", e);
		}
		return map;
	}

    /** 
	 * Method Name: insertBjList
	 * Description:  
	 * 批量创建班级
	 * @param createMan 创建人
	 * @return 成功创建的班级个数
	 * @author luhuacong
	 * @date: 2018年12月17日
	 */
	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public Integer insertBjList(List<ClassInfoDto> dtoList, String createMan) {		
		try {
			String nj = null;	//编码规则:暂存年级的代码
			String ssdwdm = null;	//编码规则:暂存所属单位代码的一部分
			String njzy = null;	//暂存专业方向代码的一部分
			String bjh = null;		//班级号
			Integer num = null;	//某专业已经存在班级的个数
			String bjmc = null;	//班级名称
			
			Integer count = 0;	//成功创建的班级个数
			for(int i = 0;i<dtoList.size();i++) {
				
				ClassInfoPo classPo = new ClassInfoPo();
				/**
				 * 根据年级代码编号获取年级专业记录
				 */
				GradeProfessionalInfoPo queryPo = new GradeProfessionalInfoPo();
				queryPo.setNjzydm(dtoList.get(i).getNjzydm());
				GradeProfessionalInfoPo graPo = gradeProfessionalInfoPoMapper.selectOne(queryPo);
				
				nj = graPo.getNj().substring(2);
				//取所属单位代码后两位
				ssdwdm = graPo.getSsxy().substring(graPo.getSsxy().length()-2, graPo.getSsxy().length());
				//取专业方向代码后两位
				njzy = graPo.getNjzydm().substring(graPo.getNjzydm().length()-2, graPo.getNjzydm().length());
				//查找某个专业已存在的班级个数
				num = classInfoPoMapper.selectCount(dtoList.get(i).getNjzydm());
				
				for(int j = 0;j<dtoList.get(i).getNum();j++) {
					//如果班级数为个位
					if(num/10==0) {
						bjh = nj+ssdwdm+njzy+"0"+(++num);
						bjmc = graPo.getNjzymc()+"0"+num+"班";
					}
					//如果班级>10
					if(num/10>0) {
						bjh = nj+ssdwdm+njzy+(++num);
						bjmc = graPo.getNjzymc()+num+"班";
					}
					
					 //设置创建人
					classPo.setCjr(createMan);
					//设置创建时间
					classPo.setCjsj(new Date());
					//设置班级名称
					classPo.setBjmc(bjmc);
					//设置班级编号
					classPo.setBjdm(bjh);
					//设置年级
					classPo.setNj(graPo.getNj());
					//设置年级专业代码
					classPo.setNjzydm(graPo.getNjzydm());
					//设置年级专业名称
					classPo.setNjzymc(graPo.getNjzymc());
					//设置所属校区
					classPo.setSsxq(graPo.getSsxq());
					//设置所属学院
					classPo.setSsxy(graPo.getSsxy());
					//设置专业类型
					classPo.setZylx(graPo.getZylx());
					//设置学制
					classPo.setXz(graPo.getXz());
					//设置是否学徒方向
					classPo.setSfxtzfx(graPo.getSfxtzfx());
					//设置是否完全学分制
					classPo.setSfwqxfz(graPo.getSfxfz());
					//设置学校编号
					classPo.setXxbh(graPo.getXxbh());
					//设置学校名称
					classPo.setXxmc(graPo.getXxmc());
					//插入班级信息

						Integer success = classInfoPoMapper.insert(classPo);
						count = count + success;

				}
				
			}
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("批量创建班级失败!", e);
		}
	}


	/** 
	 * Method Name:updateFdyByIdList
	 * Description:  
	 * 批量设置辅导员
	 * @param bjdmLList 班级代码列表
	 * @param Fdy 辅导员
	 * @param xgr 修改人
	 * @return 成功设置辅导员的班级个数
	 * @author luhuacong
	 * @date: 2018年12月19日
	 */
	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public Integer updateFdyByIdList(List<String> bjdmList, String fdy,String xgr) {
		try {
			Integer count = 0;	//统计成功设置的个数
			Integer i = 0;
			ClassInfoPo po = new ClassInfoPo();
			po.setFdy(fdy);
			po.setXgr(xgr);
			po.setXgsj(new Date());
			for(String bjdm:bjdmList) {
				po.setBjdm(bjdm);
				i = classInfoPoMapper.updateById(po);
				if(i>0) {
					count = count + i;
				}
			}
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("班级设置辅导员失败!", e);

		}
	}

	/** 
	 * Method updateXqByIdList
	 * Description:  
	 * 批量设置班级所属校区
	 * @param bjdmLList 班级代码列表
	 * @param xqdm 校区编号
	 * @param xgr 修改人
	 * @return 成功设置校区的班级个数
	 * @author luhuacong
	 * @date: 2018年12月19日
	 */
	@Override
	public Integer updateXqByIdList(List<String> bjdmList, String xqdm, String xgr) {
		try {
			Integer count = 0;	//统计成功设置的个数
			Integer i = 0;
			ClassInfoPo po = new ClassInfoPo();
			po.setSsxq(xqdm);
			po.setXgr(xgr);
			po.setXgsj(new Date());
			for(String bjdm:bjdmList) {
				po.setBjdm(bjdm);
				i = classInfoPoMapper.updateById(po);
				if(i>0) {
					count = count + i;
				}
			}
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("班级设置所属校区失败!", e);

		}
	}

	

	
	
}
